package cn.acheng.cams.domain.user.service.impl;

import cn.acheng.cams.domain.user.model.dto.LoginDTO;
import cn.acheng.cams.domain.user.model.dto.LogonDTO;
import cn.acheng.cams.domain.user.model.entity.UserEntity;
import cn.acheng.cams.domain.user.model.vo.LoginResult;
import cn.acheng.cams.domain.user.repository.IUserRepository;
import cn.acheng.cams.domain.user.service.IUserService;
import cn.acheng.cams.type.utils.JwtUtil;
import cn.hutool.crypto.SecureUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
public class UserService implements IUserService {

    @Resource
    private IUserRepository userRepository;

    @Value("${cams.jwt.config.secret-key}")
    private String sercetKey;

    @Value("${cams.jwt.config.ttl}")
    private Integer ttl;

    @Override
    public LoginResult login(LoginDTO loginDTO){
        LoginResult loginResult;
        //1.校验数据库是否存在身份+用户名相同的用户
        UserEntity user = userRepository.selectUserByUsernameAndRole(loginDTO.getUsername(),loginDTO.getRole());
        //2.若存在，则将用户密码进行加密，并与数据库密码进行对比;不存在返回错误信息
        if(user == null){
            loginResult = new LoginResult();
            loginResult.setResultInfo("用户不存在");
            log.info("用户不存在");
            return loginResult;
        }

        //3.若密码相同，则将用户命和用户身份以及jwt过期时间作为jwt载荷生成jwt;密码不同返回错误信息
        String password = loginDTO.getPassword();
        String hashPassword = SecureUtil.md5(password);
        if(!hashPassword.equals(user.getPasswordHash())){
            loginResult = new LoginResult();
            loginResult.setResultInfo("密码错误");
            log.info("密码错误");
            return loginResult;
        }

        Map<String,Object> claims = new HashMap<>();
        claims.put("username",user.getUsername());
        claims.put("role",user.getRole());

        String jwt = JwtUtil.createJwt(sercetKey,ttl,claims);
        loginResult = new LoginResult();
        loginResult.setResultInfo("登录成功");
        loginResult.setRole(user.getRole());
        loginResult.setToken(jwt);
        log.info("用户jwt:{}",jwt);
        return loginResult;
    }

    @Override
    public String logon(LogonDTO logonDTO) {
        //检查有没有相同的用户名和身份
        UserEntity userEntity = userRepository.selectUserByUsernameAndRole(logonDTO.getUsername(),logonDTO.getRole());
        if(userEntity != null){
            return "对应角色的用户已存在！！！";
        }

        logonDTO.setPassword(SecureUtil.md5(logonDTO.getPassword()));
        userRepository.insert(logonDTO);
        return "注册成功";
    }

}
